package com.web_bloks.user.client;

import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONValue;

import com.web_bloks.system.client.Logger;
import com.web_bloks.types.client.SimpleMap;

/**
 * User
 * 
 * @author Jean-Lou Dupont
 *
 */
public class User 
	extends Object {

	/**
	 * true => log-in
	 */
	boolean loginState = false;
	
	/**
	 * User parameters
	 * e.g. groups, name etc.
	 */
	SimpleMap params = null;
	
	protected User() {
		super();
		params = new SimpleMap();
	}
	
	protected User(JSONObject params) {
		super();
		this.params = new SimpleMap( params );
	}
	
	public void initFromJSON(JSONValue value) {
		
		if (null == value)
			return;
		
		//Logger.logInfo("User.fromJSON: value.toString()=" + value.toString() );
		
		JSONObject obj = null;
		
		try {
			obj = value.isObject();
			setParam("name",      obj.get("username").isString().stringValue()  );
			setParam("groups",    obj.get("groups").isString().stringValue()    );
			setParam("login_url", obj.get("login_url").isString().stringValue() );
			setParam("logout_url",obj.get("logout_url").isString().stringValue());
		} catch(Exception e) {
			// any error...
			Logger.logWarn("User.fromJSON: error extracting parameters, msg="+e.getMessage());
		}
	}
	
	/*===================================================================
	 * SETTERS / GETTERS 
	 ===================================================================*/

	public String getParam(String key) {
		if (!params.containsKey(key))
			return null;
		return params.getKey(key);
	}
	public void setParam(String key, String value) {
		params.setKey(key, value);
	}
	public boolean isEmptyParam(String key) {
		String value = params.getKey(key);
		
		return (value.length()==0);
	}
	/*===================================================================
	 * LOGIN 
	 ===================================================================*/
	public boolean isLogin() {
		return loginState;
	}
	public void setLoginState(boolean state) {
		loginState = state;
	}
	/*===================================================================
	 * ADMIN 
	 ===================================================================*/
	public boolean isAdmin() {
		return isMemberOf("admin");
	}
	/*===================================================================
	 * GROUP 
	 ===================================================================*/
	
	/**
	 * TODO optimize this
	 */
	public boolean isMemberOf(String group) {
		
		if (!params.containsKey("groups"))
			return false;
		
		String groups_list = params.getKey("groups");
		
		if (groups_list == null)
			return false;
		
		if (groups_list.length() == 0)
			return false;
		
		String[] groups = groups_list.split(",");
		
		for (int i=0;i<groups.length;i++) {
			if (groups[i].indexOf(group) != -1)
				return true;
		}
		
		return false;
	}
	
}//END